package com.cs.beneficios.web.action;
import com.cs.beneficios.business.entity.AtributosDAO;
import com.cs.beneficios.business.entity.BeneficioDAO;
import com.cs.beneficios.business.entity.RenovarDAO;
import com.cs.beneficios.business.entity.SubProgramaDAO;
//import com.cs.beneficios.business.model.BeneficiarioVO;
import com.cs.beneficios.business.model.Beneficiario_AtributoVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import com.cs.paoyer.administration.business.model.UserVO;
import java.io.IOException;

import java.sql.SQLException; 

import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;



public class BeneficioOtorgAction extends Action 
{
  /**
   * This is the main action called from the Struts framework.
   * @param mapping The ActionMapping used to select this instance.
   * @param form The optional ActionForm bean for this request.
   * @param request The HTTP Request we are processing.
   * @param response The HTTP Response we are processing.
   * @return 
   * @throws java.io.IOException
   * @throws javax.servlet.ServletException
   */
  public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
      //ConnectionFactory cf = new ConnectionFactory("beneficios","beneficios");
	  ConnectionFactory cf = new ConnectionFactory();
      HttpSession session = request.getSession();
      //Proceso para la auditoria
       UserVO user = (UserVO) request.getSession().getAttribute("userInfo");
       String terminalAddress = request.getRemoteAddr();
       String strTerminal = ("WEB="+terminalAddress);
       Calendar c = Calendar.getInstance(); 
       SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");   
      //Fin del proceso

      String strCodSub = (String)session.getAttribute("CodigoSubpro");
      String strOrigen = (String)session.getAttribute("renovacion");
      List lInsert = new LinkedList();
      String strTercero = "";
      String strCodeAtriDate = null;
      String strPosition = null;
      boolean disponibilidad = true; 
      boolean existe= false;
      try
      {
        //proceso para identificar si el beneficiario ya tiene el beneficio por primera vez
          if(strOrigen.equals("nuevo"))
          {
            String strCodigoBeneficiario = (String)session.getAttribute("beneficiario");
            BeneficioDAO objbeneDAO = new BeneficioDAO(cf);
            existe = objbeneDAO.GetExisteBeneficiario(strCodigoBeneficiario,strCodSub);
            cf.closeConnection(objbeneDAO.getConn());
          }
        //fin proceso
      }catch(SQLException e){
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSSPE - cwsub ********/");
      }      
      
      if(!existe)
      {
        
      
        String strBeneficiario = (String)session.getAttribute("beneficiario");
        String strCodigoSubpro = (String)session.getAttribute("CodigoSubpro");
        String strCodigoSede =(String)session.getAttribute("CodigoSede");
        String strCostBenefit = (String)session.getAttribute("CostBenefit");
        String strDateBenefit = (String)session.getAttribute("DateBenefit");
        //Adicion tipo beneficio
		String strTypeBenefit = (String)session.getAttribute("TipoBenefit");
		 if((Object)strCodigoSede == null)
          strCodigoSede = request.getParameter("code");
        Object obTercero = (Object)session.getAttribute("listatercero");
        Object obListaInsert = (Object)session.getAttribute("listainsetar");
        
        SubProgramaDAO objSubProgramaDAO;
        AtributosDAO objAtributoDAO;
        String CodMaxBenefOtor="";
        
        if(obTercero==null)
        {
          lInsert = (List)session.getAttribute("listainsetar");
        }else
        {
          lInsert = (List)session.getAttribute("listatercero");
          strTercero = (String)session.getAttribute("Tercero");
        }
            
        if(obListaInsert!=null)
        {
          try
          {
              BeneficioDAO objBeneDAO = new BeneficioDAO(cf);
              Long loCodigoSede = new Long(strCodigoSede);
              Long loCodigoSubp = new Long(strCodigoSubpro);
              Long loCodigoBenefi = new Long(strBeneficiario);
              objSubProgramaDAO = new SubProgramaDAO(cf);
              //Proceso para saber los dias de reutilizacion y los dias a renovar
              SubProgramaVO objsubproVO = new SubProgramaVO();
              objsubproVO = objSubProgramaDAO.GetPropiedadesSubpro(loCodigoSubp);
              cf.closeConnection(objSubProgramaDAO.getConn());
              String reutilizar = objsubproVO.getDiasReutilizar();
              //String renovacion = objsubproVO.getDiasRenovacion();
              int dreutilizar = Integer.parseInt(reutilizar.trim());
              //int drenovacion = Integer.parseInt(renovacion.trim());
              //if(dreutilizar <= 0) dreutilizar = 1;
              //double total = drenovacion/dreutilizar;
              long totaldias = 1;
              //Fin del proceso
              
              //Proceso para determinar si hay beneficios
              int disponible = objBeneDAO.GetDisponibilidad(strCodigoSede,strCodigoSubpro);
              if(totaldias > disponible)
              {
                disponibilidad = false;
              }
              //Fin del proceso
              
              if(disponibilidad)
              {
                //Proceso para traer los datos del beneficiario
                
                //Fin del proceso
                
                //Proceso para desabilitar los beneficios otorgados anteriores
                RenovarDAO objrenovar = new RenovarDAO(cf);
                objrenovar.GetBeneOtorDesabilitar(strCodigoSubpro,strBeneficiario,strCodigoSede);
                cf.closeConnection(objrenovar.getConn());
                //fin del proceso
                
                // Proceso para identificar si el beneficio tiene el atributo EDAD
                for(int i=0;i<lInsert.size();i++)
                {
                  Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO)lInsert.get(i);
                  AtributosDAO objAtributosDAO = new AtributosDAO(cf);
                  String strNameAtri = objAtributosDAO.GetNameAtri(objBenefiVO.getCodigoatributo());
                  cf.closeConnection(objAtributosDAO.getConn());
                  if (strNameAtri != null && !strNameAtri.equals(""))
                  {
                    if(strNameAtri.equals("EDAD"))
                    {
                      strCodeAtriDate = objBenefiVO.getCodigoatributo();
                      strPosition = String.valueOf(i);
                      break;
                    }
                  }
                }
                // Fin del proceso
                //Proceso para insertar en beneficio otorgado
                int d = 0;
                String strArrIns[] = {user.getName(), strTerminal};

                //for(int i=0;i<totaldias;i++)
                //{
                  //boolean insertbien = objBeneDAO.OtorgarBeneficios(loCodigoSede, loCodigoSubp,loCodigoBenefi, lInsert, strTercero,d,strArrIns,strCostBenefit,strDateBenefit);
				boolean insertbien = objBeneDAO.OtorgarBeneficios(loCodigoSede, loCodigoSubp,loCodigoBenefi, lInsert, strTercero,d,strArrIns,strCostBenefit,strDateBenefit, strTypeBenefit);
                  //d+=dreutilizar;
                  if(strCodeAtriDate != null && !strCodeAtriDate.equals("") && insertbien)//No deber�a de llevar insertbien-Claudia
                  {
                    AtributosDAO objAtriDAO = new AtributosDAO(cf);
                    String strDate = objAtriDAO.GetDateBeneficio(String.valueOf(d));
                    cf.closeConnection(objAtriDAO.getConn());
                    String strDateBirth = (String)session.getAttribute("DateBirth");
                    int iEdad = 0;
                    if(strDateBirth != null)
                    {
                      // Proceso para calcular la edad al momento de otorgar el otro beneficio
                      
                      String ArrFechaActual[] = strDate.split("/");
                      String strDayAc = ArrFechaActual[0];
                      String strMonthAc = ArrFechaActual[1];                       
                      String strYearAc = ArrFechaActual[2];
                      
                      
                      
                      String ArrFechaNacimiento[] = strDateBirth.split("/");
                      String strDayNa = ArrFechaNacimiento[0];
                      String strMonthNa = ArrFechaNacimiento[1];                       
                      String strYearNa = ArrFechaNacimiento[2];
                      
                      //resto los a�os de las dos fechas 
                       iEdad = Integer.parseInt(strYearAc) - Integer.parseInt(strYearNa) - 1; //-1 porque no se si ha cumplido a�os ya este a�o
                      
                      //si resto los meses y me da menor que 0 entonces no ha cumplido a�os. Si da mayor si ha cumplido 
                      if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) > 0)
                        iEdad +=1;
                      
                      if (((Integer.parseInt(strMonthAc)) - (Integer.parseInt(strMonthNa))) == 0)
                      {
                        //si resto los dias y me da menor que 0 entonces no ha cumplido a�os. Si da mayor o igual si ha cumplido 
                        if (((Integer.parseInt(strDayAc)) - (Integer.parseInt(strDayNa))) >= 0)
                           iEdad +=1;
                      }
                      
                      // Fin del Proceso
                    }else
                    {
                      iEdad = 0;
                    }
                    
                    // Proceso para asignar el nuevo valor
                    Beneficiario_AtributoVO objBenefiVO = (Beneficiario_AtributoVO)lInsert.get(Integer.parseInt(strPosition));
                    objBenefiVO.setVariable(String.valueOf(iEdad));
                    objBenefiVO.setTipodato(objBenefiVO.getTipodato());
                    objBenefiVO.setCodigoatributo(objBenefiVO.getCodigoatributo());
                    objBenefiVO.setCodbeneficiario(objBenefiVO.getCodbeneficiario());
                    objBenefiVO.setCodbeneotorgado(objBenefiVO.getCodbeneotorgado());
                    objBenefiVO.setTipoatributo(objBenefiVO.getTipoatributo());
                    
                    lInsert.remove((Integer.parseInt(strPosition)));
                    strPosition = String.valueOf(lInsert.size());
                    lInsert.add(objBenefiVO);
                    // Fin del proceso
                  }
                  
                  /*if(!insertbien){
                      session.setAttribute("msgdis","No hay beneficios disponibles en la sede seleccionada o puede que la sede no est� vigente");
                  }*/
                  
                //}
                session.setAttribute("msg","1");
              }else
              {
                session.setAttribute("msgdis","No hay beneficios disponibles en la sede seleccionada.");
              }
              cf.closeConnection(objBeneDAO.getConn());
              
              
          }catch(Exception e)
          {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSSPE - cwsub ********/");
          }
        }
        
      }else
      {
        session.setAttribute("msg","2");
      }
      return mapping.findForward("success");
  }
    
}